package com.baoyouqun;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class CodeGenerator {

    public static void main(String[] args) {
        // 数据库连接配置
        String jdbcUrl = "jdbc:mysql://111.79.110.11:3306/baoyouqundev?useSSL=false&serverTimezone=UTC";
        String username = "javalj";
        String password = "lxndkls13580A@";

        // 输出目录配置
        String outputDir = System.getProperty("user.dir") + "/src/main/java";
        String mapperXmlOutputDir = System.getProperty("user.dir") + "/src/main/resources/mapper";

        // 基础包名
        String basePackage = "com.baoyouqun";

        // 需要生成的表名
        String[] tableNames = {"virtual_number"};


        FastAutoGenerator.create(jdbcUrl, username, password)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("梁boy")
                            .enableSwagger()
                            .outputDir(outputDir)
                            .commentDate("yyyy-MM-dd")
                            .disableOpenDir();
                })
                // 包配置（新增VO包）
                .packageConfig(builder -> {
                    builder.parent(basePackage)
                            .controller("controller")
                            .service("service")
                            .serviceImpl("service.impl")
                            .mapper("mapper")
                            .entity("entity")
//                            .xml("mapper.xml" )
                            .pathInfo(Collections.singletonMap(OutputFile.xml, mapperXmlOutputDir));

                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tableNames)
                            // 实体类策略
                            .entityBuilder()
                            .enableLombok()
                            .enableTableFieldAnnotation()
                            // Controller策略
                            .controllerBuilder()
                            .enableRestStyle()
                            .enableHyphenStyle()
                            // Service策略
                            .serviceBuilder()
                            .formatServiceFileName("%sService")
                            .formatServiceImplFileName("%sServiceImpl")
                            // Mapper策略
                            .mapperBuilder()
                            .enableBaseResultMap()
                            .enableBaseColumnList()
                            .enableFileOverride()

                    ;
                })
                .injectionConfig(injectConfig -> {
                    Map<String, Object> customMap = new HashMap<>();
                    customMap.put("basePackage", basePackage);

                    injectConfig.customMap(customMap); //注入自定义属性
                    injectConfig
                            .customFile(new CustomFile.Builder()
                                    .fileName("VO.java") //文件名称
                                    .templatePath("/templates/VO.java.ftl") //指定生成模板路径
                                    .packageName("domain.VO")
                                    .build()
                            ) //包名,自3.5.10开始,可通过在package里面获取自定义包全路径,低版本下无法获取,示例:package.entityDTO
                            .customFile(new CustomFile.Builder()
                                    .fileName("Query.java")
                                    .templatePath("/templates/Query.java.ftl")
                                    .packageName("domain.Query")
                                    .build()
                            )
                            .customFile(new CustomFile.Builder()
                                    .fileName("CreateCmd.java")
                                    .templatePath("/templates/CreateCmd.java.ftl")
                                    .packageName("domain.CreateCmd")
                                    .build()
                            )
                            .customFile(new CustomFile.Builder()
                                    .fileName("UpdateCmd.java")
                                    .templatePath("/templates/UpdateCmd.java.ftl")
                                    .packageName("domain.UpdateCmd")
                                    .build());
                })
                // 使用Freemarker引擎解析模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();

        System.out.println("自定义模板代码生成完成！");
    }
}
    